/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ejercicio.practica9;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class RWFileMonitor {

    volatile int lectores = 0;
    volatile boolean escribiendo = false;
    File ruta;

    public RWFileMonitor(File ruta) {
        this.ruta = ruta;
    }

    synchronized void comienzaLectura() throws IOException {
        while (escribiendo) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        ++lectores;
        System.out.println("Lector inicia lectura..." );
        RandomAccessFile archivo = null;
        try {
            archivo = new RandomAccessFile(ruta, "r");
        } catch (FileNotFoundException ex) {
             System.out.println("Error: " + ex); 
        }
        while (archivo.getFilePointer() < archivo.length()) {
            System.out.println(archivo.readInt());
        }
        archivo.close();
        notifyAll();
    }

    synchronized void finalizaLectura() {
        --lectores;
        if (lectores == 0) {
            notifyAll();
        }
        System.out.println("Lector finaliza lectura...");
    }

    synchronized void comienzaEscritura() {
        while (escribiendo || (lectores != 0)) {
            try {
                wait();
            } catch (InterruptedException ex) {
                  System.out.println("Error: " + ex); 
            }
        }
        escribiendo = true;
        System.out.println("Escritor inicia escritura...");
        try {
            try (RandomAccessFile archivo = new RandomAccessFile(ruta, "rw")) {
                for (int i = 0; i < 5; i++) {
                    archivo.writeInt(i);
                }
            }
            System.out.println("Fichero creado...");

        } catch (Exception ex) {
             System.out.println("Error: " + ex); 
        }

    }

    synchronized void finalizaEscritura() {
        escribiendo = false;
        notifyAll();
        System.out.println("Escritor finaliza escritura...");
    }
}
